"""
类属性：
定义：
  定义在类里面，在方法外部，不使用self进行定义，直接是变量名=值
调用：
  在类中调用：
      1、成员方法中调用：
            通过self.类属性
      2、类方法中调用：
            通过cls.类属性
  在类的外部调用：
       1、对象名.类属性 ----->  必须先创建对象  c1=Teacher()
       2、类名.类属性     推荐
类方法
装饰器： 第一个字母是@符号，他就是装饰器
定义：  被@classmethod 装饰器所修饰
  第一个参数是cls

类方法调用：
类中：
   成员方法可以调用类属性、类方法，通过self来调用
   类方法可以调用类属性、类方法 通过cls调用、不能调用成员属性和成员方法
类外：
        1、对象名.类方法 ----->  必须先创建对象  c1=Teacher()
        2、类名.类方法    推荐
静态方法
定义 被@staticmethod所修饰的方法就是静态方法
不能调用类属性、类方法，成员方法，成员属性
类中：
    类方法和成员方法可以调用静态方法
类外
        1、对象名.类方法 ----->  必须先创建对象  c1=Teacher()
       2、 类名.静态方法

总结：
类属性  ： 类方法（cls），成员方法(self)可以调用
类方法 ：  类方法 成员方法可以调用
成员属性： 成员方法可以调用
成员方法 ： 成员方法可以调用
通过self调用

静态方法：   类方法(cls)，成员方法(self)可以调用

类外：类名.方法名---->类方法(类属性)，静态方法
    成员方法，成员属性需要对象来调用

"""

class Teacher:
    chengji=12  #类属性
    def __init__(self):
        self.name = "张三"  #成员属性
    @staticmethod
    def he():
        print("他就是第一个普通的方法")
    @classmethod
    def eat(cls):   #类方法

        cls.he()
        print(cls.chengji)  #可以调用类属性 也可以类方法
        #cls.show()  #类方法不能调用成员方法，成员属性
       # print("这个是类方法")
    @classmethod
    def sleep(cls):
        print("睡觉")
    def show(self):
        self.he()
        self.eat()  #成员方法调用类方法
        print(self.chengji) #成员方法调用类属性
t1=Teacher()
t2=Teacher()
print(t1 == t2)
# # t1.show()
# # t1.eat()
# # Teacher.eat()
# # Teacher.he()
# t1.he1()
# print(Teacher.chengji)
